package day8;

import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

//实现一个Callable接口    实现call()
public class TestCallable implements Callable<Integer> {
    String str;

    public TestCallable(String str) {
        this.str = str;
    }

    //返回值：线程执行结束了，最后返回的一个结果
    //有一个字符串，想统计字母 a 的个数
    //call():类似于run()都是表示线程执行逻辑
    //只不过它可以抛异常，可以有返回值
    @Override
    public Integer call() throws Exception {
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == 'a') {
                count++;
                Thread.sleep(1000);
                System.out.println("统计到了a:" + count);
            }
        }

        return count;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String str = sc.next();
        TestCallable testCallable = new TestCallable(str);
        //Callable和Thread没有关系，不能直接使用
        //只能通过FutureTask属于Runnable接口间接使用线程
        FutureTask<Integer> ft = new FutureTask(testCallable);
        Thread t = new Thread(ft, "DemoA");

        t.start();

        //ft.get()  用于接收call()方法的返回值
        //它会阻塞线程，因为需要等待call执行结束才会有返回值
        Integer result = ft.get();
        System.out.println("计算的结果是:" + result);
    }
}
